﻿using Bettzueche.RLLibrary.Types;

namespace Bettzueche.RLLibrary.Functions {
    /// <summary>
    /// V-Value function (auch state-value function genannt), die einem Zustand einen Wert zuweist.<br />
    /// V : S --> Double
    /// <para>
    /// Der V-Wert eines Zustands s ist die zu erwartende, aufsummierte Belohnung,
    /// die ausgehend von s unter einer bestimmten Strategie π erreicht werden kann. Der V-Wert
    /// ist ein Gütemaß eines Zustands und seine Funktion wird üblicherweise geschätzt bzw. erlernt.
    /// </para>
    /// </summary>
    public interface IValueFunction {

        /// <summary>
        /// Gibt oder setzt den Wert (V-Value)
        /// </summary>
        /// <param name="state">Zustand</param>
        /// <returns>V(s)</returns>
        double this[IState state] { get; set; }
    }




    /// <summary>
    /// Generische V-Value function (auch state-value function genannt), die einem Zustand einen Wert zuweist.<br />
    /// V : S --&gt; Double
    /// <para>
    /// Der V-Wert eines Zustands s ist die zu erwartende, aufsummierte Belohnung,
    /// die ausgehend von s unter einer bestimmten Strategie π erreicht werden kann. Der V-Wert
    /// ist ein Gütemaß eines Zustands und seine Funktion wird üblicherweise geschätzt bzw. erlernt.
    /// </para>
    /// </summary>
    /// <typeparam name="S">Type of IState</typeparam>
    /// <seealso cref="RLProject1.Model.IExplorationPolicy" />
    public interface IValueFunction<S> where S : IState
    {
        /// <summary>
        /// Gibt oder setzt den Wert (V-Value)
        /// </summary>
        /// <param name="state">Zustand</param>
        /// <returns>V(s)</returns>
        double this[S state] { get; set; }
    }
}
